import numpy as np
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
import matplotlib.pyplot as plt

#生成数据集
#random.uniform()随机生成范围在（0.5，1.5）内的2*10的实数列表
cluster1 = np.random.uniform(0.5, 1.5, (2, 10))
cluster2 = np.random.uniform(3.5, 4.5, (2, 10))

#将两个两行十列的列表进行纵向叠加，生成一个20*2的列表
X = np.hstack((cluster1, cluster2)).T


#展示随机生成的数据
plt.figure()
plt.axis([0, 5, 0, 5])
plt.grid(True)
plt.plot(X[:,0],X[:,1],'k.');
plt.show()


#遍历k并且可视化
K = range(1, 10)
meandistortions = []
for k in K:
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(X)
    #axis=0时会分别取每一列的最大值或最小值，axis=1时，会分别取每一行的最大值或最小值
    print(cdist(X, kmeans.cluster_centers_, 'euclidean'))
    meandistortions.append(sum(np.min(cdist(X, kmeans.cluster_centers_, 'euclidean'), axis=1)) / X.shape[0])

#用蓝色带拐点的线展示meandistortions的变化
plt.plot(K, meandistortions, 'bx-')
#设置x轴坐标
plt.xlabel('k')
#设置y轴坐标
# plt.ylabel('平均畸变程度',fontproperties=font)
plt.ylabel('Ave Distor')
#设置标题
plt.title('Elbow method value K');
plt.show()
